package com.yznote.cloudesk.common.utils;

import lombok.extern.slf4j.Slf4j;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

import java.util.List;
import java.util.Map;

/**
 * @author : xiaozhoutongxue
 * @date : 2022/10/17 16:34
 */

@Slf4j
//对element进行增删改查的工具类
public class EhcacheUtils {
    //使用一个静态变量保存cacheManager（create()读取类路径下的ehcache.xml文件创建单例的cacheManager）
    private static CacheManager cacheManager = CacheManager.create();

    /**
     * 从某cache中获取一个element的value
     * @param cacheName cache的名字
     * @param key       element的key
     * @return element的value
     */
    public static Object get(String cacheName, String key) {
        Cache cache = cacheManager.getCache(cacheName);
        if (cache != null&&cache.get(key)!=null) {
            return cache.get(key).getObjectValue();
        }
        return null;
    }

    /**
     * 向某cache中添加一个element(相同key的元素会添加不进去)
     * @param cacheName cache的名字
     * @param key       element的key
     * @param value     element的value
     */
    public static void add(String cacheName, String key, Object value) {
        Cache cache = cacheManager.getCache(cacheName);
        if (cache == null) {
            //使用defaultCache的配置来创建一个cache
            cacheManager.addCache(cacheName);
            Cache defaultCache = cacheManager.getCache(cacheName);
            defaultCache.put(new Element(key, value));
            log.info("cache[{}]不存在,系统使用默认配置创建cache并添加element完成!", cacheName);
        } else {
            cache.putIfAbsent(new Element(key, value));
        }
    }

    /**
     * 更新element的value，根据cacheName和key唯一确定一个element
     * @param cacheName cache的名字
     * @param key       element的key
     * @param value     element的value
     */
    public static void update(String cacheName, String key, Object value) {
        Cache cache = cacheManager.getCache(cacheName);
        if (cache != null) {
            cache.put(new Element(key, value));
        } else {
            log.error("cache[{}]不存在,更新失败!", cacheName);
        }
    }

    /**
     * 从某cache中删除某个element
     * @param cacheName cache的名字
     * @param key       element的key
     */
    public static void remove(String cacheName, String key) {
        Cache cache = cacheManager.getCache(cacheName);
        if (cache != null) {
            cache.remove(key);
        }
    }

    /**
     * 根据cacheName判断cache是否存在
     * @param cacheName cache的名字
     * @return true存在，false不存在
     */
    public static boolean checkCache(String cacheName) {
        Cache cache = cacheManager.getCache(cacheName);
        return null != cache;
    }

    /**
     * 根据cacheName和key判断key是否存在
     * @param cacheName cache的名字
     * @return true存在，false不存在
     */
    public static boolean checkCacheKey(String cacheName,String key) {
        Cache cache = cacheManager.getCache(cacheName);
        Element element = cache.get(key);
        if (element==null){
            return false;
        }
        return true;
    }

    public static List getAllkeys(String cacheName){
        Cache cache = cacheManager.getCache(cacheName);
        List keys = cache.getKeys();
        return keys;
    }
    public static String[] getAllCacheNames(){
        String[] cacheNames = cacheManager.getCacheNames();
        return cacheNames;
    }


}
